#include <iostream>
#include <gtk/gtk.h>
#include <cstdlib>
#include "variables_data.h"
#include "ingame_operations.h"
using namespace std;

extern GtkBuilder *builder;

//Ridichiarazione con parola chiave extern delle variabili globali usate nei vari file.
extern bool flag;

extern giocatori gamer, campo_gioco[6][7];

extern const char *P1, *P2;

extern unsigned int campo_gioco_pos[6][7];
extern unsigned int red_cell, yellow_cell;
extern unsigned int token;
extern unsigned int r_m_won, y_m_won; 

/**
 * Unica funzione che permette di mostrare le finestre relative alle voci dei menu_item.
 */
extern "C" void show_menu_dialog(GtkMenuItem *menuitem, gpointer user_data)
{
  	gtk_widget_show_all(GTK_WIDGET(user_data));
}

/**
 * Unica funzione di gestione tasto "Annulla" delle finestre di dialogo
 * (il nome della funzione non significa cancella ma bensì annulla).
 */
extern "C" void cancel_clicked_event(GtkWidget *widget, gpointer user_data)
{
	gtk_widget_hide(GTK_WIDGET(user_data));
}

/**
 * Mostra la finestra che chiede quale sarà il giocatore che inizierà la partita.
 * E' possibile scegliere cliccando uno dei due bottoni su cui è scritto il nome
 * dei due giocatore.
 */
extern "C" void handler_beginner_type(GtkWidget *widget, gpointer user_data)  
{
	gtk_widget_hide(GTK_WIDGET(user_data));

	GtkWidget *beginner_dialog =GTK_WIDGET(gtk_builder_get_object(builder,"dialog7"));
	gtk_widget_show_all(beginner_dialog);
	
	GtkLabel *gamer1_label =GTK_LABEL(gtk_builder_get_object(builder,"label56"));
	gtk_label_set_text(gamer1_label, P1);

	GtkLabel *gamer2_label =GTK_LABEL(gtk_builder_get_object(builder,"label74"));
	gtk_label_set_text(gamer2_label, P2);
}

/**
 * Permette al giocatore_1 di iniziare la partita.
 * gamer viene settato a 'player1' e poi vinene invocata ::create_match.
 * Viene anche aggiornata la label che mostra a chi sta fare la mossa.
 */
extern "C" void handler_red_begin(GtkWidget *widget, gpointer user_data)
{
	gtk_widget_hide(GTK_WIDGET(user_data));

	gamer=player1;
	create_match();

	GtkLabel *turn_label =GTK_LABEL(gtk_builder_get_object(builder,"label68"));
	gtk_label_set_text(turn_label, P1);
}

/**
 * Permette al giocatore_2 di iniziare la partita.
 * gamer viene settato a 'player2' e poi vinene invocata ::create_match.
 * Viene anche aggiornata la label che mostra a chi sta fare la mossa.
 */
extern "C" void handler_yellow_begin(GtkWidget *widget, gpointer user_data)
{
	gtk_widget_hide(GTK_WIDGET(user_data));

	gamer=player2;
	create_match();

	GtkLabel *turn_label =GTK_LABEL(gtk_builder_get_object(builder,"label68"));
	gtk_label_set_text(turn_label, P2);
}

/**
 * Funzione che provoca l'uscita dal ciclo gtk_main e quindi l'uscita dal programma;
 * usata dalle finestre aventi il pulsante 'Esci dal gioco'.
 */
extern "C" void handler_quit_event(GtkWidget *widget, gpointer user_data)
{
	gtk_main_quit() ;
}

/**
 * Funzione usata solo per la chiusura della finestra campo di gioco 
 * (quando si clicca sulla 'x' per uscire).
 * Questa provoca anche l'uscita dal programma. 
 */
extern "C" void handler_delete_event(GtkWidget *widget, gpointer user_data)
{
  	GtkWidget *exit_dialog =GTK_WIDGET(gtk_builder_get_object(builder,"dialog1")) ;
	gtk_widget_show_all(exit_dialog) ;
}

/**
 * Mostra correttamente la finestra di vittoria settando la label contenente
 *  il nome del relativo giocatore. Alcuni dei parametri passati sono analoghi
 * a quelli passati alla funzione ::check_horiz_plus_verti.
 *
 * @param[in] g_won Contiene il numero di vittorie totali di un certo giocatore.
 * @param[in] g_pun Puntatore alla stringa g_label.
 * @param[in] g_label Stringa contenente il nome del giocatore che ha vinto.
 * @param[in] g_dialog Stringa contenente il nome della finestra di dialogo da mostrare.					
 */
void actual_winner(unsigned int &g_won, const char *g_pun, const char g_label[], const char g_dialog[])
{
	set_index_sensitive(42, false);

	GtkLabel *win_label =GTK_LABEL(gtk_builder_get_object(builder,g_label));
	gtk_label_set_text(win_label, g_pun);
	GtkWidget *dialog =GTK_WIDGET(gtk_builder_get_object(builder,g_dialog));
	gtk_widget_show_all(dialog);

	g_won++;
	points_updater();
}

/**
 * Mostra la documentazione invocando firefox
 */
extern "C" void doc_handler(GtkWidget *widget, gpointer data)
{
    system("firefox doc/html/index.html &") ;
}		

